﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TestesFixacao.Dominio;
using TestesFixacao.Dominio.Modelos;
using TestesFixacao.Dominio.Repositorios;
using TestesFixacao.Dominio.Repositorios.ADO;
using TestesFixacao.WindowsApp.Properties;

namespace TestesFixacao.WindowsApp
{
    public partial class Principal : Form
    {
        private IRepositorioDisciplina _repositorioDisciplina;
        private IRepositorioMateria _repositorioMateria;
        private IRepositorioSerie _repositorioSerie;

        private Disciplina _disciplina;

        public Principal()
        {
            InitializeComponent();
            _repositorioDisciplina = new RepositorioAdoDisciplina();
            _repositorioMateria = new RepositorioAdoMateria();
            _repositorioSerie = new RepositorioAdoSerie();

            listDisciplinas.Items.OverrideAll(_repositorioDisciplina.SelecionaTodos());
            lsbMateriaConsulta.Items.OverrideAll(_repositorioMateria.SelecionaTodos());
        }

        #region botões menu

        private void importarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                //_repositorioDisciplina.Importa(openFileDialog1.FileName);

                listDisciplinas.Items.OverrideAll(_repositorioDisciplina.SelecionaTodos());

                MessageBox.Show(Resources.mensagemImportacaoSucesso, "", MessageBoxButtons.OK,
                             MessageBoxIcon.Information);
            }
        }

        private void exportarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                //_repositorioDisciplina.Exporta(saveFileDialog1.FileName);

                listDisciplinas.Items.OverrideAll(_repositorioDisciplina.SelecionaTodos());

                MessageBox.Show(Resources.mensagemExportacaoSucesso, "", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
        }

        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }

        #endregion botões menu

        #region botões serie

        private void btnGravarDisciplina_Click(object sender, EventArgs e)
        {
            if (_disciplina == null)
                MontaDisciplina();

            if (int.Parse(txtDisciplinaNumero.Text) > 0)
            {
                _repositorioDisciplina.Edita(_disciplina);
            }
            else
                _repositorioDisciplina.Adiciona(_disciplina);

            LimpaCampos(txtDisciplinaNome, txtDisciplinaNumero, listQuestoes);

            listDisciplinas.Items.OverrideAll(_repositorioDisciplina.SelecionaTodos());

            _disciplina = null;
        }

        private void btnEditarDisciplina_Click(object sender, EventArgs e)
        {
            Disciplina disciplinaSelecionada = listDisciplinas.SelectedItem as Disciplina;

            if (disciplinaSelecionada == null)
            {
                MessageBox.Show(Resources.disciplinaNaoSelecionada);
                return;
            }

            txtDisciplinaNumero.Text = disciplinaSelecionada.Numero.ToString();
            txtDisciplinaNome.Text = disciplinaSelecionada.Nome;
            listQuestoes.Items.OverrideAll(disciplinaSelecionada.Questoes);

            tabDisciplinas.SelectedTab = tabDisciplinaInsercaoEdicao;

            _disciplina = null;
        }

        private void btnNovoDisciplina_Click(object sender, EventArgs e)
        {
            LimpaCampos(txtDisciplinaNome, txtDisciplinaNumero, listQuestoes);
        }

        private void btnExcluirDisciplina_Click(object sender, EventArgs e)
        {
            Disciplina disciplinaSelecionada = listDisciplinas.SelectedItem as Disciplina;

            if (disciplinaSelecionada == null)
            {
                MessageBox.Show(Resources.disciplinaNaoSelecionada);
                return;
            }
            if (MessageBox.Show(Resources.perguntaExclusaoDisciplina, "Aviso", MessageBoxButtons.OK,
                            MessageBoxIcon.Question) == DialogResult.OK)
            {
                _repositorioDisciplina.Exclui(disciplinaSelecionada);

                listDisciplinas.Items.OverrideAll(_repositorioDisciplina.SelecionaTodos());
            }
        }

        #endregion botões serie

        #region botões questão

        private void btnInserirQuestao_Click(object sender, EventArgs e)
        {
            if (_disciplina == null) MontaDisciplina();

            QuestaoDialog dialog = new QuestaoDialog();
            dialog.Questao = new Questao();

            DialogResult resposta = dialog.ShowDialog();

            if (resposta == DialogResult.OK)
            {
                var questao = dialog.Questao;

                _disciplina.AdicionaQuestao(questao);
                listQuestoes.Items.OverrideAll(_disciplina.Questoes);
            }
        }

        private void btnEditarQuestao_Click(object sender, EventArgs e)
        {
            Questao questaoSelecionada = listQuestoes.SelectedItem as Questao;

            if (questaoSelecionada == null)
            {
                MessageBox.Show(Resources.questaoNaoSelecionada, "Aviso", MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                return;
            }

            QuestaoDialog dialog = new QuestaoDialog();
            dialog.Questao = questaoSelecionada;

            if (dialog.ShowDialog() == DialogResult.OK)
            {
                var questao = dialog.Questao;

                _disciplina.EditaQuestao(questao);

                listQuestoes.Items.OverrideAll(_disciplina.Questoes);
            }
        }

        private void btnExcluirQuestao_Click(object sender, EventArgs e)
        {
            Questao questaoSelecionada = listQuestoes.SelectedItem as Questao;

            if (questaoSelecionada == null)
            {
                MessageBox.Show(Resources.questaoNaoSelecionada, "Aviso", MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                return;
            }

            if (MessageBox.Show(Resources.perguntaExclusaoQuestao, "Aviso", MessageBoxButtons.OK,
                                MessageBoxIcon.Question) == DialogResult.OK)
            {
                _disciplina.RemoveQuestao(questaoSelecionada.Numero);

                listQuestoes.Items.OverrideAll(_disciplina.Questoes);
            }
        }

        #endregion botões questão

        #region métodos privados

        private void MontaDisciplina()
        {
            _disciplina = new Disciplina();

            _disciplina.Numero = int.Parse(txtDisciplinaNumero.Text);
            _disciplina.Nome = txtDisciplinaNome.Text;
        }

        private void LimpaCampos(params Control[] componentes)
        {
            foreach (var componente in componentes)
            {
                if (componente is ListBox)
                    ((ListBox)componente).Items.Clear();
                else if (componente is ComboBox)
                    ((ComboBox)componente).SelectedIndex = -1;
                else
                    componente.ResetText();
            }

            txtDisciplinaNumero.Text = "0";
        }

        #endregion métodos privados

        private void toolStripButton8_Click(object sender, EventArgs e)
        {
        }

        private void toolStripButton4_Click(object sender, EventArgs e)
        {
            Materia novaMateria = new Materia();
            novaMateria.Nome = txtMateriaNome.Text;
            novaMateria.Serie = ((Serie)cmbSerie.SelectedItem).Numero;
            novaMateria.Disciplina = (Disciplina)cmbDisciplina.SelectedItem;

            _repositorioMateria.Adiciona(novaMateria);
        }

        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (tabControl1.SelectedIndex)
            {
                case 0:
                    break;

                case 1:
                    cmbDisciplina.DataSource = _repositorioDisciplina.SelecionaTodos();
                    cmbSerie.DataSource = _repositorioSerie.SelecionaTodos();
                    break;

                case 2:
                    break;
            }
        }

        private void tbcMateria_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (tbcMateria.SelectedIndex)
            {
                case 0:
                    break;

                case 1:
                    lsbMateriaConsulta.Items.OverrideAll(_repositorioMateria.SelecionaTodos());
                    break;
                default:
                    break;
            }
        }

        private void toolStripButton6_Click(object sender, EventArgs e)
        {
            Materia materiaSelecionada = lsbMateriaConsulta.SelectedItem as Materia;

            if (materiaSelecionada == null)
            {
                MessageBox.Show(Resources.disciplinaNaoSelecionada);
                return;
            }

            txtMateriaNome.Text = materiaSelecionada.Nome;
        }

        private void toolStripButton7_Click(object sender, EventArgs e)
        {
            Materia materiaSelecionado = lsbMateriaConsulta.SelectedItem as Materia;

            _repositorioMateria.Exclui(materiaSelecionado);

            tbcMateria.SelectedTab = tbpInsersaoEdicao;
        }
    }
}